package com.fa7.trabalho.service;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.fa7.trabalho.dao.MensagemDao;
import com.fa7.trabalho.dao.PerfilDao;
import com.fa7.trabalho.entidades.Mensagem;
import com.fa7.trabalho.entidades.Perfil;
import com.fa7.trabalho.entidades.SeguidorSeguinte;

@Service("mensagemService")
public class MensagemService {
	
	@Autowired
	private MensagemDao mensagemDao;
	
	@Autowired
	private PerfilDao perfilDao;
	
	public void enviarMensagem(Perfil perfilUsuario, Perfil perfilCitado, String mensagem){
		try {

			Mensagem novaMensagem = new Mensagem();
			novaMensagem.setTexto(mensagem);
			novaMensagem.setPerfil(perfilUsuario);
			if(perfilCitado != null) {
				novaMensagem.setPerfilCitado(perfilCitado);
			}
			novaMensagem.setDataCriacao(new Date());

			getMensagemDao().save(novaMensagem);
			getMensagemDao().flush();

		} catch (Exception e) {
			System.out.println("error:" + e.getMessage());
		}
	}
	
	public List<Mensagem> retornaMensagensPerfil(Perfil perfilUsuario){
		List<Mensagem> mensagens = new ArrayList<Mensagem>();
		mensagens.addAll(mensagemDao.findByPerfilOrderByDataCriacaoDesc(perfilUsuario));
		mensagens.addAll(mensagemDao.findByPerfilCitadoOrderByDataCriacaoDesc(perfilUsuario));
		mensagens.addAll(this.retornaMensagensSeguintes(perfilUsuario));
		Collections.sort(mensagens);
		
		return mensagens;
	}
	
	private List<Mensagem> retornaMensagensSeguintes(Perfil perfilUsuario){
		Perfil perfilAtualizado = perfilDao.findOne(perfilUsuario.getId());
		List<Mensagem> mensagens = new ArrayList<Mensagem>();
		List<SeguidorSeguinte> seguintes = new ArrayList<SeguidorSeguinte>();
		seguintes = perfilAtualizado.getSeguintes();
		if(seguintes != null && !seguintes.isEmpty()){
			for(SeguidorSeguinte seguinte : seguintes){
				mensagens.addAll(mensagemDao.findByPerfilOrderByDataCriacaoDesc(seguinte.getSeguinte()));
			}
		}
		
		return mensagens;
	}
	
	public void teste(){
		System.out.println("metodo para teste");
	}
	

	public MensagemDao getMensagemDao() {
		return mensagemDao;
	}

	public void setMensagemDao(MensagemDao mensagemDao) {
		this.mensagemDao = mensagemDao;
	}

}
